package com.hmall.gateway.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;

/**
 * 安全配置类
 * 用于配置安全相关的Bean，如密码编码器和JWT密钥对
 */
@Configuration  // 标识为配置类
@EnableConfigurationProperties(JwtProperties.class)  // 启用JwtProperties配置类
public class SecurityConfig {

    /**
     * 密码编码器Bean
     * 用于密码的加密与验证
     * @return BCrypt密码编码器
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * JWT密钥对Bean
     * 用于JWT的签名和验证
     * @param properties JWT配置属性
     * @return 密钥对（公钥和私钥）
     */
    @Bean
    public KeyPair keyPair(JwtProperties properties) {
        // 1. 创建密钥库密钥工厂
        // 使用配置的密钥文件和密码初始化
        KeyStoreKeyFactory keyStoreKeyFactory =
                new KeyStoreKeyFactory(
                        properties.getLocation(),  // 密钥文件位置
                        properties.getPassword().toCharArray());  // 密钥库密码

        // 2. 从密钥库中读取密钥对
        // 使用配置的密钥别名和密码获取具体的密钥对
        return keyStoreKeyFactory.getKeyPair(
                properties.getAlias(),  // 密钥别名
                properties.getPassword().toCharArray());  // 密钥密码
    }
}